package _9_博客园Redis

import (
	"fmt"
	"github.com/go-redis/redis"
)

/*
redis的set类型（集合）是string类型数值的无序集合，并且集合元素唯一。
下面介绍go redis的集合用法。

go redis 集合（set）常用函数列表：

	SAdd - 添加集合元素
	SCard - 获取集合元素个数
	Sdiff - 差集,命令返回第一个集合与其他集合之间的差异
	Sdiffstore - 命令将给定集合之间的差集存储在指定的集合中。如果指定的集合 key 已存在，则会被覆盖
	Sinter - 交集 命令返回给定所有给定集合的交集
	Sinterstore - 命令将给定集合之间的交集存储在指定的集合中。如果指定的集合已经存在，则将其覆盖。
	Sunion - 命令返回给定集合的并集。不存在的集合 key 被视为空集
	Sunionstore - 命令将给定集合的并集存储在指定的集合 destination 中。如果 destination 已经存在，则将其覆盖
	Smove - 命令将指定成员 member 元素从 source 集合移动到 destination 集合 SMOVE myset1 myset2 "bar"
	SISMember - 判断元素是否在集合中
	SMembers - 获取集合中所有的元素
	SRem - 删除集合元素
	SPop,SPopN - 随机返回集合中的元素，并且删除返回的元素
*/
func main() {
	//(0)初始化一个新的redis client
	client := redis.NewClient(&redis.Options{
		Addr:     "localhost:6379", // redis地址
		Password: "",               // redis没密码，没有设置，则留空
		DB:       0,                // 使用默认数据库
	})

	//(1)SAdd添加集合元素
	// 添加100到集合中
	err := client.SAdd("key", 100).Err()
	if err != nil {
		panic(err)
	}

	// 将100,200,300添加到集合中
	client.SAdd("key", 100, 200, 300)

	//(2)SCard获取集合元素个数
	size, err := client.SCard("key").Result()
	if err != nil {
		panic(err)
	}
	fmt.Println(size)

	//(3)SIsMember判断元素是否在集合中
	// 检测100是否包含在集合中
	ok, _ := client.SIsMember("key", 100).Result()
	if ok {
		fmt.Println("集合包含指定元素")
	}

	//(4)SMembers获取集合中所有的元素
	es, _ := client.SMembers("key").Result()
	// 返回的es是string数组
	fmt.Println(es)

	//(5)SRem删除集合元素
	// 删除集合中的元素100
	client.SRem("key", 100)

	// 删除集合中的元素tizi和2019
	client.SRem("key", "tizi", "2019")

	//(6)SPop,SPopN随机返回集合中的元素，并且删除返回的元素
	// 随机返回集合中的一个元素，并且删除这个元素
	val, _ := client.SPop("key").Result()
	fmt.Println(val)

	// 随机返回集合中的5个元素，并且删除这些元素
	vals, _ := client.SPopN("key", 5).Result()
	fmt.Println(vals)
}
